home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / mitchell.c < prev    next >
C/C++ Source or Header  |  2000-05-04  |  8KB  |  323 lines

  1. /***************************************************************************
  2.  
  3.  Pang Video Hardware
  4.  
  5. ***************************************************************************/
  6.  
  7. #include "vidhrdw/generic.h"
  8. #include "palette.h"
  9.  
  10.  
  11. /* Globals */
  12. size_t pang_videoram_size;
  13. unsigned char *pang_videoram;
  14. unsigned char *pang_colorram;
  15.  
  16. /* Private */
  17. static unsigned char *pang_objram;           /* Sprite RAM */
  18.  
  19. static struct tilemap *bg_tilemap;
  20. static int flipscreen;
  21.  
  22. /* Declarations */
  23. void pang_vh_stop(void);
  24.  
  25.  
  26.  
  27. /***************************************************************************
  28.  
  29.   Callbacks for the TileMap code
  30.  
  31. ***************************************************************************/
  32.  
  33. static void get_tile_info(int tile_index)
  34. {
  35.     unsigned char attr = pang_colorram[tile_index];
  36.     int code = pang_videoram[2*tile_index] + (pang_videoram[2*tile_index+1] << 8);
  37.     SET_TILE_INFO(0,code,attr & 0x7f)
  38.     tile_info.flags = (attr & 0x80) ? TILE_FLIPX : 0;
  39. }
  40.  
  41.  
  42.  
  43. /***************************************************************************
  44.  
  45.   Start the video hardware emulation.
  46.  
  47. ***************************************************************************/
  48.  
  49. int pang_vh_start(void)
  50. {
  51.     pang_objram=NULL;
  52.     paletteram=NULL;
  53.  
  54.  
  55.     bg_tilemap = tilemap_create(get_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE,8,8,64,32);
  56.  
  57.     if (!bg_tilemap)
  58.         return 1;
  59.  
  60.     /*
  61.         OBJ RAM
  62.     */
  63.     pang_objram=malloc(pang_videoram_size);
  64.     if (!pang_objram)
  65.     {
  66.         pang_vh_stop();
  67.         return 1;
  68.     }
  69.     memset(pang_objram, 0, pang_videoram_size);
  70.  
  71.     /*
  72.         Palette RAM
  73.     */
  74.     paletteram = malloc(2*Machine->drv->total_colors);
  75.     if (!paletteram)
  76.     {
  77.         pang_vh_stop();
  78.         return 1;
  79.     }
  80.     memset(paletteram, 0, 2*Machine->drv->total_colors);
  81.  
  82.     palette_transparent_color = 0; /* background color (Block Block uses this on the title screen) */
  83.  
  84.     return 0;
  85. }
  86.  
  87. void pang_vh_stop(void)
  88. {
  89.     free(pang_objram);
  90.     pang_objram = 0;
  91.     free(paletteram);
  92.     paletteram = 0;
  93. }
  94.  
  95.  
  96.  
  97. /***************************************************************************
  98.  
  99.   Memory handlers
  100.  
  101. ***************************************************************************/
  102.  
  103. /***************************************************************************
  104.   OBJ / CHAR RAM HANDLERS (BANK 0 = CHAR, BANK 1=OBJ)
  105. ***************************************************************************/
  106.  
  107. static int video_bank;
  108.  
  109. WRITE_HANDLER( pang_video_bank_w )
  110. {
  111.     /* Bank handler (sets base pointers for video write) (doesn't apply to mgakuen) */
  112.     video_bank = data;
  113. }
  114.  
  115. WRITE_HANDLER( mgakuen_videoram_w )
  116. {
  117.     if (pang_videoram[offset] != data)
  118.     {
  119.         pang_videoram[offset] = data;
  120.         tilemap_mark_tile_dirty(bg_tilemap,offset/2);
  121.     }
  122. }
  123.  
  124. READ_HANDLER( mgakuen_videoram_r )
  125. {
  126.     return pang_videoram[offset];
  127. }
  128.  
  129. WRITE_HANDLER( mgakuen_objram_w )
  130. {
  131.     pang_objram[offset]=data;
  132. }
  133.  
  134. READ_HANDLER( mgakuen_objram_r )
  135. {
  136.     return pang_objram[offset];
  137. }
  138.  
  139. WRITE_HANDLER( pang_videoram_w )
  140. {
  141.     if (video_bank) mgakuen_objram_w(offset,data);
  142.     else mgakuen_videoram_w(offset,data);
  143. }
  144.  
  145. READ_HANDLER( pang_videoram_r )
  146. {
  147.     if (video_bank) return mgakuen_objram_r(offset);
  148.     else return mgakuen_videoram_r(offset);
  149. }
  150.  
  151. /***************************************************************************
  152.   COLOUR RAM
  153. ****************************************************************************/
  154.  
  155. WRITE_HANDLER( pang_colorram_w )
  156. {
  157.     if (pang_colorram[offset] != data)
  158.     {
  159.         pang_colorram[offset] = data;
  160.         tilemap_mark_tile_dirty(bg_tilemap,offset);
  161.     }
  162. }
  163.  
  164. READ_HANDLER( pang_colorram_r )
  165. {
  166.     return pang_colorram[offset];
  167. }
  168.  
  169. /***************************************************************************
  170.   PALETTE HANDLERS (COLOURS: BANK 0 = 0x00-0x3f BANK 1=0x40-0xff)
  171. ****************************************************************************/
  172.  
  173. static int paletteram_bank;
  174.  
  175. WRITE_HANDLER( pang_gfxctrl_w )
  176. {
  177. logerror("PC %04x: pang_gfxctrl_w %02x\n",cpu_get_pc(),data);
  178. {
  179.     char baf[40];
  180.     sprintf(baf,"%02x",data);
  181. //    usrintf_showmessage(baf);
  182. }
  183.  
  184.     /* bit 0 is unknown (used, maybe back color enable?) */
  185.  
  186.     /* bit 1 is coin counter */
  187.     coin_counter_w(0,data & 2);
  188.  
  189.     /* bit 2 is flip screen */
  190.     if (flipscreen != (data & 0x04))
  191.     {
  192.         flipscreen = data & 0x04;
  193.         tilemap_set_flip(ALL_TILEMAPS,flipscreen ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
  194.     }
  195.  
  196.     /* bit 3 is unknown (used, e.g. marukin pulses it on the title screen) */
  197.  
  198.     /* bit 4 selects OKI M6295 bank */
  199.     OKIM6295_set_bank_base(0, ALL_VOICES, (data & 0x10) ? 0x40000 : 0x00000);
  200.  
  201.     /* bit 5 is palette RAM bank selector (doesn't apply to mgakuen) */
  202.     paletteram_bank = data & 0x20;
  203.  
  204.     /* bits 6 and 7 are unknown, used in several places. At first I thought */
  205.     /* they were bg and sprites enable, but this screws up spang (screen flickers */
  206.     /* every time you pop a bubble). However, not using them as enable bits screws */
  207.     /* up marukin - you can see partially built up screens during attract mode. */
  208. }
  209.  
  210. WRITE_HANDLER( pang_paletteram_w )
  211. {
  212.     if (paletteram_bank) paletteram_xxxxRRRRGGGGBBBB_w(offset + 0x800,data);
  213.     else paletteram_xxxxRRRRGGGGBBBB_w(offset,data);
  214. }
  215.  
  216. READ_HANDLER( pang_paletteram_r )
  217. {
  218.     if (paletteram_bank) return paletteram_r(offset + 0x800);
  219.     return paletteram_r(offset);
  220. }
  221.  
  222. WRITE_HANDLER( mgakuen_paletteram_w )
  223. {
  224.     paletteram_xxxxRRRRGGGGBBBB_w(offset,data);
  225. }
  226.  
  227. READ_HANDLER( mgakuen_paletteram_r )
  228. {
  229.     return paletteram_r(offset);
  230. }
  231.  
  232.  
  233.  
  234. /***************************************************************************
  235.  
  236.   Display refresh
  237.  
  238. ***************************************************************************/
  239.  
  240. static void mark_sprites_palette(void)
  241. {
  242.     int offs,color,code,attr,i;
  243.     int colmask[16];
  244.     int pal_base;
  245.  
  246.  
  247.     pal_base = Machine->drv->gfxdecodeinfo[1].color_codes_start;
  248.  
  249.     for (color = 0;color < 16;color++) colmask[color] = 0;
  250.  
  251.     /* the last entry is not a sprite, we skip it otherwise spang shows a bubble */
  252.     /* moving diagonally across the screen */
  253.     for (offs = 0x1000-0x40;offs >= 0;offs -= 0x20)
  254.     {
  255.         attr = pang_objram[offs+1];
  256.         code = pang_objram[offs] + ((attr & 0xe0) << 3);
  257.         color = attr & 0x0f;
  258.  
  259.         colmask[color] |= Machine->gfx[1]->pen_usage[code];
  260.     }
  261.  
  262.     for (color = 0;color < 16;color++)
  263.     {
  264.         for (i = 0;i < 15;i++)
  265.         {
  266.             if (colmask[color] & (1 << i))
  267.                 palette_used_colors[pal_base + 16 * color + i] |= PALETTE_COLOR_VISIBLE;
  268.         }
  269.     }
  270. }
  271.  
  272. static void draw_sprites(struct osd_bitmap *bitmap)
  273. {
  274.     int offs,sx,sy;
  275.  
  276.     /* the last entry is not a sprite, we skip it otherwise spang shows a bubble */
  277.     /* moving diagonally across the screen */
  278.     for (offs = 0x1000-0x40;offs >= 0;offs -= 0x20)
  279.     {
  280.         int code = pang_objram[offs];
  281.         int attr = pang_objram[offs+1];
  282.         int color = attr & 0x0f;
  283.         sx = pang_objram[offs+3] + ((attr & 0x10) << 4);
  284.         sy = ((pang_objram[offs+2] + 8) & 0xff) - 8;
  285.         code += (attr & 0xe0) << 3;
  286.         if (flipscreen)
  287.         {
  288.             sx = 496 - sx;
  289.             sy = 240 - sy;
  290.         }
  291.         drawgfx(bitmap,Machine->gfx[1],
  292.                  code,
  293.                  color,
  294.                  flipscreen,flipscreen,
  295.                  sx,sy,
  296.                  &Machine->drv->visible_area,TRANSPARENCY_PEN,15);
  297.     }
  298. }
  299.  
  300. void pang_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  301. {
  302.     int i;
  303.  
  304.     tilemap_update(ALL_TILEMAPS);
  305.  
  306.     palette_init_used_colors();
  307.  
  308.     mark_sprites_palette();
  309.  
  310.     /* the following is required to make the colored background work */
  311.     for (i = 15;i < Machine->drv->total_colors;i += 16)
  312.         palette_used_colors[i] = PALETTE_COLOR_TRANSPARENT;
  313.  
  314.     if (palette_recalc())
  315.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  316.  
  317.     tilemap_render(ALL_TILEMAPS);
  318.  
  319.     tilemap_draw(bitmap,bg_tilemap,0);
  320.  
  321.     draw_sprites(bitmap);
  322. }
  323.